import _ from 'lodash';

let notAtomConfigTypes = ['array', 'object', 'group', 'colors', 'menu', 'modal'];

// reduce config
// {
//   title: "标题",
//   series: [{
//     child1: {
//       input: "文本",
//       number: 123
//     }
//   }]
// }
export function reduceConfig(config) {
	if (!Array.isArray(config)) {
		return config;
	}
	return config.reduce((result, item) => {
		result[item.name] =
			item.type && !notAtomConfigTypes.includes(item.type) ? item.value : reduceConfig(item.value);
		return result;
	}, {});
}

// 会影响target的值，最好事先deepclone
export function increaseConfig(config, target, type) {
	Object.keys(config).forEach((key) => {
		let c = findConfigDataByName(target, key, type);
		if (_.isNil(c)) {
			return;
		}
		// 根据target的type来判断数据结构是否为复杂结构，例如数组
		// 当target的type值不存在时也为复杂结构
		if (c.type && !notAtomConfigTypes.includes(c.type)) {
			// 简单结构数据直接赋值
			c.value = config[key];
		} else {
			// 复杂结构数据处理
			if (c.type === 'array') {
				const arrTplt = c.config.template;
				c.value = [];
				Object.keys(config[key]).forEach((name, idx) => {
					const newArrEle = _.cloneDeep(arrTplt);
					// 使“数据序列”重新排序
					newArrEle.name = `${newArrEle.name}${idx + 1}`;
					newArrEle.displayName = `${newArrEle.displayName}${idx + 1}`;
					// 为了维持“数据序列”原有的排序
					// newArrEle.name = name
					// newArrEle.displayName = `${newArrEle.displayName}${name.replace(/[^0-9]/ig,"")}`
					c.value.push(newArrEle);
				});
			}
			//  else {
			increaseConfig(config[key], c.value, c.type);
			// }
		}
	});
}

// 用于解析3.15之前的老版本带下划线的配置
export function reduceConfigWithUndeline(config) {
	if (!Array.isArray(config)) {
		return config;
	}
	return config.reduce((result, item) => {
		result[item._name] =
			item._type && !notAtomConfigTypes.includes(item._type)
				? item._value
				: reduceConfigWithUndeline(item._value);
		return result;
	}, {});
}

// 用于获取name对应的对象值，仅适用于configData中不存在name重复的对象
export function findConfigDataByName(configData, name, type) {
	// let data;
	// configData.some((el) => {
	// 	if (el.name === name) {
	// 		data = el;
	// 		return true;
	// 	}
	// });
	// return data;// 写的什么臭狗屎
	return configData.find((el) => el.name === name);
}

// 用于获取value对应的对象值，仅适用于configData中不存在value重复的对象
export function findConfigDataByValue(configData, value) {
	if (!Array.isArray(configData)) {
		return configData;
	}
	let data;
	configData.some((el) => {
		if (el.value === value) {
			data = el;
			return true;
		}
	});
	return data;
}

const _collectCallbackConfigPath = (config, path, collector) => {
	if (!Array.isArray(config)) {
		return;
	}
	config.forEach((ele) => {
		if (ele.type && !notAtomConfigTypes.includes(ele.type)) {
			if (ele.type === 'callback') {
				const targetPath = path ? `${path}.${ele.name}` : ele.name;
				if (!collector.find((x) => x === targetPath)) {
					collector.push(targetPath);
				}
			}
		} else {
			const targetPath = path ? `${path}.${ele.name}` : ele.name;
			_collectCallbackConfigPath(ele.value, targetPath, collector);
		}
	});
};

/**
 * 收集回调组件配置路径， 会改变 collector 的值
 * @param {*} config
 * @param {*} path
 * @param {*} collector
 * @returns
 */
export function collectCallbackConfigPath(config) {
	const collector = [];
	_collectCallbackConfigPath(config, '', collector);
	return collector;
}
